/************************
 * 功能：按键驱动程序
 * 作者：张亚辉
 * email：huiaove@126.com
 * 描述：独立按键驱动程序，具有按键长按，按下，释放等事件回调
 * Data：2023/10/28
 * 地点：tianjin
 * *********************/
#include "ZY_Button.h"

/// @brief 按键注册
/// @param tcb 按键控制句柄
/// @param pin_cb 硬件引脚
/// @param time 消抖时间
void ZY_Button_Register_f(ZY_BUTTON_t *tcb,Button_Pin_cb pin_cb,uint16_t time,uint8_t id)
{
	tcb->pin_cb=pin_cb;
	tcb->id=id;
	Register_GlitchFilter(&tcb->filter,time);
	tcb->click.Enable=false;
	tcb->key_down.Enable=false;
	tcb->key_up.Enable=false;
	tcb->LongPress.Enable=false;
}
/// @brief 按键点击事件注册
/// @param tcb 按键控制句柄
/// @param cb 事件回调
void ZY_ButtonRegister_EventClick(ZY_BUTTON_t *tcb,ButtonEvent_cb cb)
{
	tcb->click.event_cb=cb;
	tcb->click.Enable=true;
}
/// @brief 按键长按事件注册
/// @param tcb 按键控制句柄
/// @param time 长按事件
/// @param cb 事件回调
void ZY_ButtonRegister_EventLongPress(ZY_BUTTON_t *tcb,ButtonEvent_cb cb,uint16_t time)
{
	tcb->LongPress.event_cb=cb;
	tcb->time.LongPress_time=time;
	tcb->LongPress.Enable=true;
}
/// @brief 按键释放事件
/// @param tcb 按键控制句柄
/// @param cb 事件回调
void ZY_ButtonRegister_EventKeyUP(ZY_BUTTON_t *tcb,ButtonEvent_cb cb)
{
	tcb->key_up.event_cb=cb;
	tcb->key_up.Enable=true;
}
/// @brief 按键按下事件
/// @param tcb 
/// @param cb 事件回调
void ZY_ButtonRegister_EventKeyDown(ZY_BUTTON_t *tcb,ButtonEvent_cb cb)
{
	tcb->key_down.event_cb=cb;
	tcb->key_down.Enable=true;
}
/// @brief 按键轮询过程
/// @param tcb 按键控制句柄
/// @param time 轮询事件
void ZY_Button_Process(ZY_BUTTON_t *tcb,uint16_t time)
{
	uint8_t key_status;
	key_status=tcb->pin_cb(MSG_Get_PIN_Key,tcb->id);
	key_status=GlitchFilter_Value(&tcb->filter,key_status,time);
	if(key_status==Button_down)
	{
		if(tcb->LongPress.Enable)
		{
			tcb->time.time+=time;
			if(tcb->time.time>tcb->time.LongPress_time)
			{
				tcb->LongPress.event_cb(tcb->id);
				tcb->time.time=0;
				//return;
			}
		}
	}
	else
	{
		tcb->time.time=0;
	}
	if(key_status!=tcb->status.status)
	{
		tcb->status.status=key_status;
		if(key_status==Button_down)
		{
			if(tcb->click.Enable)
			  tcb->click.event_cb(tcb->id);
			if(tcb->key_down.Enable)
				tcb->key_down.event_cb(tcb->id);
		}
		else
		{
			if(tcb->key_up.Enable)
			{
				tcb->key_up.event_cb(tcb->id);
			}
		}
	}
}